﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Notas
{
    public enum  Armadura
    {
        A, Bb, B, C, Db, D, Eb, E, F, Fs, G, Ab
    }

    public enum Clave
    {
        C, F, G
    }

    public enum Tom
    {
        Maior, Menor
    }

    class Util
    {
        private static readonly List<string> EscalaCromaticaAscendente = new List<string> { "A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#" };
        private static readonly List<string> EscalaCromaticaDescendente = new List<string> { "A", "Bb", "B", "C", "Db", "D", "Eb", "E", "F", "Gb", "G", "Ab" };
        private static readonly int[] EscalaMaior = new[] { 0, 2, 4, 5, 7, 9, 11};//TTsTTTs

        public static string[] MontaEscala(Armadura nota, Tom tom)
        {            
            switch (tom)
            {
                case Tom.Maior:
                    return MontaEscalaMaior(nota);
            }
            return null;
        }

        private static string[] MontaEscalaMaior(Armadura nota)
        {
            //1-> Verifico se escala e ASCENDENTE ou DESCENDENTE
            var escalaSelecionada = EscalaCromaticaAscendente;
            if(nota.ToString().IndexOf('b')>-1)
            {
                escalaSelecionada = EscalaCromaticaDescendente;
            }

            
            //1-> Localizo posicao da nota passada na escala cromatica
            int pos = PosicaoNotaEscalaCromatica(nota, escalaSelecionada);

            //Se for uma nota invalida
            if(pos == -1)
            {
                return null;
            }

            //2-> Organizo as notas de acordo com a nota da escala
            var escala = new List<string>();
            for (int i = pos; i < escalaSelecionada.Count; i++)
            {
                escala.Add(escalaSelecionada[i]);
            }

            for (int i = 0; i < pos; i++)
            {
                escala.Add(escalaSelecionada[i]);
            }

            //3-> Feito isso, temos a escala cromatica organizada
            var ret = new string[7];
            for (int i = 0; i < 7; i++)
            {
                pos = EscalaMaior[i];
                ret[i] = escala[pos];
            }
            return ret;
        }

        /**
         * Localiza a posicao da nota na escala cromatica
         **/
        private static int PosicaoNotaEscalaCromatica(Armadura nota, IList<string> escala)
        {
            //Como e um ENUM, nao posso usar o #
            var tmp = nota.ToString().Replace('s', '#');
            var count = escala.Count;
            for (int i = 0; i < count; i++)
            {
                if (escala[i].Equals(tmp))
                {
                    return i;
                }
            }
            return -1;
        }
    }
}
